#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
模板文件自动转换脚本 - 将Flask模板语法转换为Django模板语法
"""
import os
import re
from pathlib import Path


def convert_template_file(file_path):
    """转换单个模板文件"""
    print(f"正在转换: {file_path}")
    
    with open(file_path, 'r', encoding='utf-8') as f:
        content = f.read()
    
    original_content = content
    
    # 1. 在文件开头添加 {% load static %} (如果还没有)
    if '{% load static %}' not in content and 'static' in content.lower():
        # 找到第一个非空行后添加
        lines = content.split('\n')
        insert_index = 0
        for i, line in enumerate(lines):
            if line.strip() and not line.strip().startswith('<!'):
                insert_index = i
                break
            if line.strip().startswith('<!DOCTYPE') or line.strip().startswith('<html'):
                insert_index = i + 1
                break
        
        if insert_index > 0:
            lines.insert(insert_index, '{% load static %}')
            content = '\n'.join(lines)
    
    # 2. 转换 url_for('view_name') 为 {% url 'view_name' %}
    # 处理无参数的情况
    content = re.sub(
        r"{{\s*url_for\(['\"]([^'\"]+)['\"]\)\s*}}",
        r"{% url '\1' %}",
        content
    )
    
    # 处理带参数的情况 url_for('view', id=value)
    content = re.sub(
        r"{{\s*url_for\(['\"]([^'\"]+)['\"]\s*,\s*(\w+)\s*=\s*([^)]+)\)\s*}}",
        r"{% url '\1' \3 %}",
        content
    )
    
    # 3. 转换静态文件引用
    # url_for('static', filename='path') -> {% static 'path' %}
    content = re.sub(
        r"{{\s*url_for\(['\"]static['\"]\s*,\s*filename\s*=\s*['\"]([^'\"]+)['\"]\)\s*}}",
        r"{% static '\1' %}",
        content
    )
    
    # 转换 href="{{ url_for('static', filename='...') }}"
    content = re.sub(
        r'''href\s*=\s*["\']?\{\{\s*url_for\(['\"]static['\"]\s*,\s*filename\s*=\s*['\"]([^'\"]+)['\"]\)\s*\}\}["\']?''',
        r"href=\"{% static '\1' %}\"",
        content
    )
    
    # 转换 src="{{ url_for('static', filename='...') }}"
    content = re.sub(
        r'''src\s*=\s*["\']?\{\{\s*url_for\(['\"]static['\"]\s*,\s*filename\s*=\s*['\"]([^'\"]+)['\"]\)\s*\}\}["\']?''',
        r"src=\"{% static '\1' %}\"",
        content
    )
    
    # 4. 转换消息提示
    # {% with messages = get_flashed_messages(with_categories=true) %}
    content = re.sub(
        r'{%\s*with\s+messages\s*=\s*get_flashed_messages\([^)]*\)\s*%}',
        '{% if messages %}',
        content
    )
    
    # 替换 {% for category, message in messages %}
    content = re.sub(
        r'{%\s*for\s+category\s*,\s*message\s+in\s+messages\s*%}',
        '{% for message in messages %}',
        content
    )
    
    # 替换 {{ category }} 为 {{ message.tags }}
    content = re.sub(
        r'{%\s*if\s+category\s*==\s*[\'"](\w+)[\'"]\s*%}',
        r"{% if message.tags == '\1' %}",
        content
    )
    
    # 5. 转换 session 访问
    # {{ session.user_id }} -> {{ request.user.id }}
    content = re.sub(
        r'{%\s*if\s+session\.user_id\s*%}',
        '{% if request.user.is_authenticated %}',
        content
    )
    
    content = re.sub(
        r'{%\s*if\s+session\.role\s*==\s*[\'"]admin[\'"]\s*%}',
        '{% if request.user.role == "admin" %}',
        content
    )
    
    content = re.sub(
        r'{{\s*session\.username\s*}}',
        '{{ request.user.username }}',
        content
    )
    
    # 6. 简化的静态文件路径转换 (直接路径)
    # /static/... -> {% static '...' %}
    content = re.sub(
        r'''href\s*=\s*["']/static/([^"']+)["']''',
        r"href=\"{% static '\1' %}\"",
        content
    )
    
    content = re.sub(
        r'''src\s*=\s*["']/static/([^"']+)["']''',
        r"src=\"{% static '\1' %}\"",
        content
    )
    
    # 7. 转换命名空间的URL
    # url_for('admin.view') -> {% url 'admin:view' %}
    content = re.sub(
        r"{%\s*url\s+'(\w+)\.(\w+)'\s*%}",
        r"{% url '\1:\2' %}",
        content
    )
    
    # 处理 href/action 中的命名空间
    content = re.sub(
        r'''(href|action)\s*=\s*["']\{\%\s*url\s+'(\w+)\.(\w+)'\s*\%\}["']''',
        r'''\1="{% url '\2:\3' %}"''',
        content
    )
    
    # 只有在内容发生变化时才写回文件
    if content != original_content:
        with open(file_path, 'w', encoding='utf-8') as f:
            f.write(content)
        print(f"✓ 已更新: {file_path}")
        return True
    else:
        print(f"- 无需更新: {file_path}")
        return False


def convert_all_templates(templates_dir):
    """转换所有模板文件"""
    templates_path = Path(templates_dir)
    
    if not templates_path.exists():
        print(f"错误: 模板目录不存在: {templates_dir}")
        return
    
    html_files = list(templates_path.rglob('*.html'))
    total_files = len(html_files)
    updated_files = 0
    
    print(f"\n找到 {total_files} 个HTML模板文件")
    print("=" * 60)
    
    for html_file in html_files:
        if convert_template_file(html_file):
            updated_files += 1
    
    print("=" * 60)
    print(f"\n转换完成!")
    print(f"总文件数: {total_files}")
    print(f"已更新: {updated_files}")
    print(f"无需更新: {total_files - updated_files}")


if __name__ == '__main__':
    # 获取项目根目录
    project_root = Path(__file__).parent
    templates_dir = project_root / 'templates'
    
    print("=" * 60)
    print("Flask模板转Django模板 - 自动转换工具")
    print("=" * 60)
    
    convert_all_templates(templates_dir)
    
    print("\n✅ 所有模板文件已处理完成!")
    print("\n⚠️ 注意事项:")
    print("1. 请手动检查转换后的文件,确保语法正确")
    print("2. 某些复杂的逻辑可能需要手动调整")
    print("3. 建议在转换前备份原始文件")
